//package lib.popup
//
//import android.R
//import android.app.Activity
//import android.app.Application
//import android.content.Context
//import android.content.res.Configuration
//import android.graphics.Rect
//import android.os.Build
//import android.os.Handler
//import android.os.Looper
//import android.view.*
//import android.widget.EditText
//import android.widget.FrameLayout
//import androidx.core.view.ViewCompat
//import androidx.fragment.app.FragmentActivity
//import androidx.lifecycle.*
//import com.blankj.utilcode.util.KeyboardUtils
//import java.util.ArrayList
//
///**
// *  author: luoXiong
// *  e-mail: 382060748@qq.com
// *  date: 2021/9/2 17:16
// *  version: 1.0
// *  desc:
// */
//abstract class BasePopupView(context: Context) : FrameLayout(context), LifecycleObserver,
//    LifecycleOwner {
//    lateinit var popupInfo: PopupInfo
//    protected var popupContentAnimator: PopupAnimator? = null
//    protected var shadowBgAnimator: ShadowBgAnimator? = null
//    protected var blurAnimator: BlurAnimator? = null
//    private val touchSlop: Int
//    var popupStatus: PopupStatus = PopupStatus.Dismiss
//    protected var isCreated = false
//    private var hasModifySoftMode = false
//    private var preSoftMode = -1
//    private var hasMoveUp = false
//    protected var handler = Handler(Looper.getMainLooper())
//    protected var lifecycleRegistry: LifecycleRegistry
//    override fun getLifecycle(): Lifecycle {
//        return lifecycleRegistry
//    }
//
//    fun show(): BasePopupView {
//        val activity: Activity = XPopupUtils.context2Activity(this)
//        if (activity == null || activity.isFinishing || popupInfo == null) {
//            return this
//        }
//        if (popupStatus === PopupStatus.Showing || popupStatus === PopupStatus.Dismissing) return this
//        popupStatus = PopupStatus.Showing
//        if (popupInfo.isRequestFocus) KeyboardUtils.hideSoftInput(activity.window)
//        if (!popupInfo.isViewMode && dialog != null && dialog!!.isShowing) return this@BasePopupView
//        handler.post(attachTask)
//        return this
//    }
//
//    private val attachTask = Runnable { // 1. add PopupView to its host.
//        attachToHost()
//        //2. 注册对话框监听器
//        KeyboardUtils.registerSoftInputChangedListener(getHostWindow(), this@BasePopupView, object : KeyboardUtils.OnSoftInputChangedListener() {
//            fun onSoftInputChanged(height: Int) {
//                onKeyboardHeightChange(height)
//                if (popupInfo != null && popupInfo.xPopupCallback != null) {
//                    popupInfo.xPopupCallback.onKeyBoardStateChanged(this@BasePopupView, height)
//                }
//                hasMoveUp = if (height == 0) { // 说明输入法隐藏
//                    XPopupUtils.moveDown(this@BasePopupView)
//                    false
//                } else {
//                    //                        if (hasMoveUp) return;
//                    //when show keyboard, move up
//                    if (this@BasePopupView is PartShadowPopupView && popupStatus === PopupStatus.Showing) {
//                        return
//                    }
//                    XPopupUtils.moveUpToKeyboard(height, this@BasePopupView)
//                    true
//                }
//            }
//        })
//
//        // 3. do init，game start.
//        init()
//    }
//    var dialog: FullScreenDialog? = null
//    private fun attachToHost() {
//        requireNotNull(popupInfo) { "如果弹窗对象是复用的，则不要设置isDestroyOnDismiss(true)" }
//        if (context is FragmentActivity) {
//            (context as FragmentActivity).lifecycle.addObserver(this)
//        }
//        if (popupInfo.isViewMode) {
//            //view实现
//            val decorView = (context as Activity).window.decorView as ViewGroup
//            var navHeight = 0
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//                val navBarView = decorView.findViewById<View>(R.id.navigationBarBackground)
//                if (navBarView != null) navHeight = navBarView.measuredHeight
//            }
//            if (parent != null) (parent as ViewGroup).removeView(this)
//            decorView.addView(
//                this, LayoutParams(
//                    LayoutParams.MATCH_PARENT,
//                    decorView.measuredHeight - navHeight
//                )
//            )
//        } else {
//            //dialog实现
//            if (dialog == null) {
//                dialog = FullScreenDialog(context)
//                    .setContent(this)
//            }
//            dialog!!.show()
//        }
//    }
//
//    protected fun getWindowDecorView(): View? {
//        return if (getHostWindow() == null) null else getHostWindow()!!.decorView as ViewGroup
//    }
//
//    /**
//     * 执行初始化
//     */
//    protected fun init() {
//        if (shadowBgAnimator == null) shadowBgAnimator = ShadowBgAnimator(this, getAnimationDuration(), getShadowBgColor())
//        if (popupInfo.hasBlurBg) {
//            blurAnimator = BlurAnimator(this, getShadowBgColor())
//            blurAnimator.hasShadowBg = popupInfo.hasShadowBg
//            blurAnimator.decorBitmap = XPopupUtils.view2Bitmap(XPopupUtils.context2Activity(this).getWindow().getDecorView())
//        }
//
//        //1. 初始化Popup
//        if (this is AttachPopupView || this is BubbleAttachPopupView
//            || this is PartShadowPopupView || this is PositionPopupView
//        ) {
//            initPopupContent()
//        } else if (!isCreated) {
//            initPopupContent()
//        }
//        if (!isCreated) {
//            isCreated = true
//            onCreate()
//            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
//            if (popupInfo.xPopupCallback != null) popupInfo.xPopupCallback.onCreated(this)
//        }
//        handler.postDelayed(initTask, 10)
//    }
//
//    private val initTask = Runnable {
//        if (getHostWindow() == null) return@Runnable
//        if (popupInfo.xPopupCallback != null) popupInfo.xPopupCallback.beforeShow(this@BasePopupView)
//        beforeShow()
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
//        if (this@BasePopupView !is FullScreenPopupView) focusAndProcessBackPress()
//
//        //由于部分弹窗有个位置设置过程，需要在位置设置完毕自己开启动画
//        if (this@BasePopupView !is AttachPopupView && this@BasePopupView !is BubbleAttachPopupView
//            && this@BasePopupView !is PositionPopupView
//            && this@BasePopupView !is PartShadowPopupView
//        ) {
//            initAnimator()
//            doShowAnimation()
//            doAfterShow()
//        }
//    }
//
//    protected fun initAnimator() {
//        getPopupContentView().alpha = 1f
//        // 优先使用自定义的动画器
//        if (popupInfo.customAnimator != null) {
//            popupContentAnimator = popupInfo.customAnimator
//            popupContentAnimator.targetView = getPopupContentView()
//        } else {
//            // 根据PopupInfo的popupAnimation字段来生成对应的动画执行器，如果popupAnimation字段为null，则返回null
//            popupContentAnimator = genAnimatorByPopupType()
//            if (popupContentAnimator == null) {
//                popupContentAnimator = getPopupAnimator()
//            }
//        }
//
//        //3. 初始化动画执行器
//        if (popupInfo.hasShadowBg) {
//            shadowBgAnimator.initAnimator()
//        }
//        if (popupInfo.hasBlurBg && blurAnimator != null) {
//            blurAnimator.initAnimator()
//        }
//        if (popupContentAnimator != null) {
//            popupContentAnimator.initAnimator()
//        }
//    }
//
//    private fun detachFromHost() {
//        if (popupInfo != null && popupInfo.isViewMode) {
//            val decorView = parent as ViewGroup
//            decorView?.removeView(this)
//        } else {
//            if (dialog != null) dialog!!.dismiss()
//        }
//    }
//
//    fun getHostWindow(): Window? {
//        if (popupInfo != null && popupInfo.isViewMode) return (context as Activity).window
//        return if (dialog == null) null else dialog!!.window
//    }
//
//    protected fun doAfterShow() {
//        handler.removeCallbacks(doAfterShowTask)
//        handler.postDelayed(doAfterShowTask, getAnimationDuration().toLong())
//    }
//
//    protected var doAfterShowTask = Runnable {
//        popupStatus = PopupStatus.Show
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
//        onShow()
//        (this@BasePopupView as? FullScreenPopupView)?.focusAndProcessBackPress()
//        if (popupInfo != null && popupInfo.xPopupCallback != null) popupInfo.xPopupCallback.onShow(this@BasePopupView)
//        //再次检测移动距离
//        if (getHostWindow() != null && XPopupUtils.getDecorViewInvisibleHeight(getHostWindow()) > 0 && !hasMoveUp) {
//            XPopupUtils.moveUpToKeyboard(XPopupUtils.getDecorViewInvisibleHeight(getHostWindow()), this@BasePopupView)
//        }
//    }
//    private var showSoftInputTask: ShowSoftInputTask? = null
//    fun focusAndProcessBackPress() {
//        if (popupInfo != null && popupInfo.isRequestFocus) {
//            if (popupInfo.isViewMode) {
//                isFocusableInTouchMode = true
//                isFocusable = true
//                requestFocus()
//            }
//            // 此处焦点可能被内部的EditText抢走，也需要给EditText也设置返回按下监听
//            if (Build.VERSION.SDK_INT >= 28) {
//                addOnUnhandledKeyListener(this)
//            } else {
//                setOnKeyListener(BackPressListener())
//            }
//
//            //let all EditText can process back pressed.
//            val list = ArrayList<EditText>()
//            XPopupUtils.findAllEditText(list, getPopupContentView() as ViewGroup)
//            if (list.size > 0) {
//                if (popupInfo.isViewMode) {
//                    preSoftMode = getHostWindow()!!.attributes.softInputMode
//                    getHostWindow()!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
//                    hasModifySoftMode = true
//                }
//                for (i in list.indices) {
//                    val et = list[i]
//                    if (Build.VERSION.SDK_INT >= 28) {
//                        addOnUnhandledKeyListener(et)
//                    } else {
//                        val hasSetKeyListener: Boolean = XPopupUtils.hasSetKeyListener(et)
//                        if (!hasSetKeyListener) et.setOnKeyListener(BackPressListener())
//                    }
//                    if (i == 0) {
//                        if (popupInfo.autoFocusEditText) {
//                            et.isFocusable = true
//                            et.isFocusableInTouchMode = true
//                            et.requestFocus()
//                            if (popupInfo.autoOpenSoftInput) showSoftInput(et)
//                        } else {
//                            if (popupInfo.autoOpenSoftInput) showSoftInput(this)
//                        }
//                    }
//                }
//            } else {
//                if (popupInfo.autoOpenSoftInput) showSoftInput(this)
//            }
//        }
//    }
//
//    protected fun addOnUnhandledKeyListener(view: View?) {
//        ViewCompat.addOnUnhandledKeyEventListener(
//            view!!
//        ) { v, event -> processKeyEvent(event.keyCode, event) }
//    }
//
//    protected fun showSoftInput(focusView: View?) {
//        if (popupInfo != null) {
//            if (showSoftInputTask == null) {
//                showSoftInputTask = ShowSoftInputTask(focusView)
//            } else {
//                handler.removeCallbacks(showSoftInputTask!!)
//            }
//            handler.postDelayed(showSoftInputTask!!, 10)
//        }
//    }
//
//    fun dismissOrHideSoftInput() {
//        if (KeyboardUtils.sDecorViewInvisibleHeightPre === 0) {
//            dismiss()
//        } else KeyboardUtils.hideSoftInput(this@BasePopupView)
//    }
//
//    internal class ShowSoftInputTask(var focusView: View?) : Runnable {
//        override fun run() {
//            if (focusView != null) {
//                KeyboardUtils.showSoftInput(focusView)
//            }
//        }
//    }
//
//    protected fun processKeyEvent(keyCode: Int, event: KeyEvent): Boolean {
//        if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP && popupInfo != null) {
//            if (popupInfo.isDismissOnBackPressed &&
//                (popupInfo.xPopupCallback == null || !popupInfo.xPopupCallback.onBackPressed(this@BasePopupView))
//            ) {
//                dismissOrHideSoftInput()
//            }
//            return true
//        }
//        return false
//    }
//
//    internal inner class BackPressListener : OnKeyListener {
//        override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean {
//            return processKeyEvent(keyCode, event)
//        }
//    }
//
//    /**
//     * 根据PopupInfo的popupAnimation字段来生成对应的内置的动画执行器
//     */
//    protected fun genAnimatorByPopupType(): PopupAnimator? {
//        if (popupInfo == null || popupInfo.popupAnimation == null) return null
//        when (popupInfo.popupAnimation) {
//            ScaleAlphaFromCenter, ScaleAlphaFromLeftTop, ScaleAlphaFromRightTop, ScaleAlphaFromLeftBottom, ScaleAlphaFromRightBottom -> return ScaleAlphaAnimator(
//                getPopupContentView(),
//                getAnimationDuration(),
//                popupInfo.popupAnimation
//            )
//            TranslateAlphaFromLeft, TranslateAlphaFromTop, TranslateAlphaFromRight, TranslateAlphaFromBottom -> return TranslateAlphaAnimator(
//                getPopupContentView(),
//                getAnimationDuration(),
//                popupInfo.popupAnimation
//            )
//            TranslateFromLeft, TranslateFromTop, TranslateFromRight, TranslateFromBottom -> return TranslateAnimator(
//                getPopupContentView(),
//                getAnimationDuration(),
//                popupInfo.popupAnimation
//            )
//            ScrollAlphaFromLeft, ScrollAlphaFromLeftTop, ScrollAlphaFromTop, ScrollAlphaFromRightTop, ScrollAlphaFromRight, ScrollAlphaFromRightBottom, ScrollAlphaFromBottom, ScrollAlphaFromLeftBottom -> return ScrollScaleAnimator(
//                getPopupContentView(),
//                getAnimationDuration(),
//                popupInfo.popupAnimation
//            )
//            NoAnimation -> return EmptyAnimator(getPopupContentView(), getAnimationDuration())
//        }
//        return null
//    }
//
//    protected abstract fun getInnerLayoutId(): Int
//
//    /**
//     * 如果你自己继承BasePopupView来做，这个不用实现
//     *
//     * @return
//     */
//    protected fun getImplLayoutId(): Int {
//        return -1
//    }
//
//    /**
//     * 获取PopupAnimator，用于每种类型的PopupView自定义自己的动画器
//     *
//     * @return
//     */
//    protected fun getPopupAnimator(): PopupAnimator? {
//        return null
//    }
//
//    /**
//     * 请使用onCreate，主要给弹窗内部用，不要去重写。
//     */
//    protected fun initPopupContent() {}
//
//    /**
//     * do init.
//     */
//    protected fun onCreate() {}
//    protected fun applyDarkTheme() {}
//    protected fun applyLightTheme() {}
//
//    /**
//     * 执行显示动画：动画由2部分组成，一个是背景渐变动画，一个是Content的动画；
//     * 背景动画由父类实现，Content由子类实现
//     */
//    protected fun doShowAnimation() {
//        if (popupInfo == null) return
//        if (popupInfo.hasShadowBg && !popupInfo.hasBlurBg && shadowBgAnimator != null) {
//            shadowBgAnimator.animateShow()
//        } else if (popupInfo.hasBlurBg && blurAnimator != null) {
//            blurAnimator.animateShow()
//        }
//        if (popupContentAnimator != null) popupContentAnimator.animateShow()
//    }
//
//    /**
//     * 执行消失动画：动画由2部分组成，一个是背景渐变动画，一个是Content的动画；
//     * 背景动画由父类实现，Content由子类实现
//     */
//    protected fun doDismissAnimation() {
//        if (popupInfo == null) return
//        if (popupInfo.hasShadowBg && !popupInfo.hasBlurBg && shadowBgAnimator != null) {
//            shadowBgAnimator.animateDismiss()
//        } else if (popupInfo.hasBlurBg && blurAnimator != null) {
//            blurAnimator.animateDismiss()
//        }
//        if (popupContentAnimator != null) popupContentAnimator.animateDismiss()
//    }
//
//    /**
//     * 获取内容View，本质上PopupView显示的内容都在这个View内部。
//     * 而且我们对PopupView执行的动画，也是对它执行的动画
//     *
//     * @return
//     */
//    fun getPopupContentView(): View {
//        return getChildAt(0)
//    }
//
//    fun getPopupImplView(): View {
//        return (getPopupContentView() as ViewGroup).getChildAt(0)
//    }
//
//    fun getAnimationDuration(): Int {
//        if (popupInfo == null) return 0
//        if (popupInfo.popupAnimation === NoAnimation) return 1
//        return if (popupInfo.animationDuration >= 0) popupInfo.animationDuration else XPopup.getAnimationDuration() + 1
//    }
//
//    fun getShadowBgColor(): Int {
//        return if (popupInfo != null && popupInfo.shadowBgColor !== 0) popupInfo.shadowBgColor else XPopup.getShadowBgColor()
//    }
//
//    fun getStatusBarBgColor(): Int {
//        return if (popupInfo != null && popupInfo.statusBarBgColor !== 0) popupInfo.statusBarBgColor else XPopup.getStatusBarBgColor()
//    }
//
//    /**
//     * 弹窗的最大宽度，用来限制弹窗的最大宽度
//     * 返回0表示不限制，默认为0
//     *
//     * @return
//     */
//    protected fun getMaxWidth(): Int {
//        return popupInfo.maxWidth
//    }
//
//    /**
//     * 弹窗的最大高度，用来限制弹窗的最大高度
//     * 返回0表示不限制，默认为0
//     *
//     * @return
//     */
//    protected fun getMaxHeight(): Int {
//        return popupInfo.maxHeight
//    }
//
//    /**
//     * 弹窗的宽度，用来动态设定当前弹窗的宽度，受getMaxWidth()限制
//     * 返回0表示不设置，默认为0
//     *
//     * @return
//     */
//    protected fun getPopupWidth(): Int {
//        return popupInfo.popupWidth
//    }
//
//    /**
//     * 弹窗的高度，用来动态设定当前弹窗的高度，受getMaxHeight()限制
//     * 返回0表示不设置，默认为0
//     *
//     * @return
//     */
//    protected fun getPopupHeight(): Int {
//        return popupInfo.popupHeight
//    }
//
//    /**
//     * 消失
//     */
//    fun dismiss() {
//        handler.removeCallbacks(attachTask)
//        handler.removeCallbacks(initTask)
//        if (popupStatus === PopupStatus.Dismissing || popupStatus === PopupStatus.Dismiss) return
//        popupStatus = PopupStatus.Dismissing
//        clearFocus()
//        if (popupInfo != null && popupInfo.xPopupCallback != null) popupInfo.xPopupCallback.beforeDismiss(this)
//        beforeDismiss()
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
//        doDismissAnimation()
//        doAfterDismiss()
//    }
//
//    /**
//     * 会等待弹窗show动画执行完毕再消失
//     */
//    fun smartDismiss() {
//        handler.post { delayDismiss((getAnimationDuration() + 50).toLong()) }
//    }
//
//    fun delayDismiss(delay: Long) {
//        var delay = delay
//        if (delay < 0) delay = 0
//        handler.postDelayed({ dismiss() }, delay)
//    }
//
//    fun delayDismissWith(delay: Long, runnable: Runnable?) {
//        dismissWithRunnable = runnable
//        delayDismiss(delay)
//    }
//
//    protected fun doAfterDismiss() {
//        // PartShadowPopupView要等到完全关闭再关闭输入法，不然有问题
//        if (popupInfo != null && popupInfo.autoOpenSoftInput && this !is PartShadowPopupView) KeyboardUtils.hideSoftInput(this)
//        handler.removeCallbacks(doAfterDismissTask)
//        handler.postDelayed(doAfterDismissTask, getAnimationDuration().toLong())
//    }
//
//    protected var doAfterDismissTask = Runnable {
//        popupStatus = PopupStatus.Dismiss
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
//        if (popupInfo == null) return@Runnable
//        if (popupInfo.autoOpenSoftInput && this@BasePopupView is PartShadowPopupView) KeyboardUtils.hideSoftInput(this@BasePopupView)
//        onDismiss()
//        XPopup.longClickPoint = null
//        if (popupInfo.xPopupCallback != null) {
//            popupInfo.xPopupCallback.onDismiss(this@BasePopupView)
//        }
//        if (dismissWithRunnable != null) {
//            dismissWithRunnable!!.run()
//            dismissWithRunnable = null //no cache, avoid some bad edge effect.
//        }
//        if (popupInfo.isRequestFocus && popupInfo.isViewMode) {
//            // 让根布局拿焦点，避免布局内RecyclerView类似布局获取焦点导致布局滚动
//            if (getWindowDecorView() != null) {
//                val needFocusView = getWindowDecorView()!!.findViewById<View>(R.id.content)
//                if (needFocusView != null) {
//                    needFocusView.isFocusable = true
//                    needFocusView.isFocusableInTouchMode = true
//                }
//            }
//        }
//        // 移除弹窗，GameOver
//        detachFromHost()
//    }
//    var dismissWithRunnable: Runnable? = null
//    fun dismissWith(runnable: Runnable?) {
//        dismissWithRunnable = runnable
//        dismiss()
//    }
//
//    fun isShow(): Boolean {
//        return popupStatus !== PopupStatus.Dismiss
//    }
//
//    fun isDismiss(): Boolean {
//        return popupStatus === PopupStatus.Dismiss
//    }
//
//    fun toggle() {
//        if (isShow()) {
//            dismiss()
//        } else {
//            show()
//        }
//    }
//
//    /**
//     * 尝试移除弹窗内的Fragment，如果提供了Fragment的名字
//     */
//    protected fun tryRemoveFragments() {
//        if (context is FragmentActivity) {
//            val manager = (context as FragmentActivity).supportFragmentManager
//            val fragments = manager.fragments
//            val internalFragmentNames = getInternalFragmentNames()
//            if (fragments != null && fragments.size > 0 && internalFragmentNames != null) {
//                for (i in fragments.indices) {
//                    val name = fragments[i].javaClass.simpleName
//                    if (internalFragmentNames.contains(name)) {
//                        manager.beginTransaction()
//                            .remove(fragments[i])
//                            .commitAllowingStateLoss()
//                    }
//                }
//            }
//        }
//    }
//
//    /**
//     * 在弹窗内嵌入Fragment的场景中，当弹窗消失后，由于Fragment被Activity的FragmentManager缓存，
//     * 会导致弹窗重新创建的时候，Fragment会命中缓存，生命周期不再执行。为了处理这种情况，只需重写：
//     * getInternalFragmentNames() 方法，返回嵌入的Fragment名称，XPopup会自动移除Fragment缓存。
//     * 名字是: Fragment.getClass().getSimpleName()
//     *
//     * @return
//     */
//    protected fun getInternalFragmentNames(): List<String>? {
//        return null
//    }
//
//    /**
//     * 消失动画执行完毕后执行
//     */
//    protected fun onDismiss() {}
//
//    /**
//     * onDismiss之前执行一次
//     */
//    protected fun beforeDismiss() {}
//
//    /**
//     * onCreated之后，onShow之前执行
//     */
//    protected fun beforeShow() {
//        val isLandscape = (context.resources.configuration.orientation
//                == Configuration.ORIENTATION_LANDSCAPE)
//        if (isLandscape && (this is BottomPopupView || this is FullScreenPopupView
//                    || this is DrawerPopupView && popupInfo.popupPosition !== PopupPosition.Right)
//        ) {
//            setPadding(XPopupUtils.getStatusBarHeight(), 0, 0, 0)
//        }
//    }
//
//    /**
//     * 显示动画执行完毕后执行
//     */
//    protected fun onShow() {}
//    protected fun onKeyboardHeightChange(height: Int) {}
//    @OnLifecycleEvent(value = Lifecycle.Event.ON_DESTROY)
//    fun onDestroy() {
//        onDetachedFromWindow()
//        detachFromHost()
//        destroy()
//    }
//
//    fun destroy() {
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
//        if (popupInfo != null) {
//            popupInfo.atView = null
//            popupInfo.watchView = null
//            popupInfo.xPopupCallback = null
//            if (popupInfo.customAnimator != null && popupInfo.customAnimator.targetView != null) {
//                popupInfo.customAnimator.targetView.animate().cancel()
//            }
//            if (popupInfo.isViewMode) tryRemoveFragments()
//            if (popupInfo.isDestroyOnDismiss) popupInfo = null
//        }
//        if (dialog != null) {
//            dialog!!.contentView = null
//            dialog = null
//        }
//        if (shadowBgAnimator != null && shadowBgAnimator.targetView != null) {
//            shadowBgAnimator.targetView.animate().cancel()
//        }
//        if (blurAnimator != null && blurAnimator.targetView != null) {
//            blurAnimator.targetView.animate().cancel()
//            if (blurAnimator.decorBitmap != null && !blurAnimator.decorBitmap.isRecycled()) {
//                blurAnimator.decorBitmap.recycle()
//                blurAnimator.decorBitmap = null
//            }
//        }
//    }
//
//    override fun onDetachedFromWindow() {
//        super.onDetachedFromWindow()
//        handler.removeCallbacksAndMessages(null)
//        if (popupInfo != null) {
//            if (getWindowDecorView() != null) KeyboardUtils.removeLayoutChangeListener(getHostWindow(), this@BasePopupView)
//            if (popupInfo.isViewMode && hasModifySoftMode) {
//                //还原WindowSoftMode
//                getHostWindow()!!.setSoftInputMode(preSoftMode)
//                hasModifySoftMode = false
//            }
//            if (popupInfo.isDestroyOnDismiss) destroy() //如果开启isDestroyOnDismiss，强制释放资源
//        }
//        if (context != null && context is FragmentActivity) {
//            (context as FragmentActivity).lifecycle.removeObserver(this)
//        }
//        popupStatus = PopupStatus.Dismiss
//        showSoftInputTask = null
//        hasMoveUp = false
//    }
//
//    private fun passClickThrough(event: MotionEvent) {
//        if (popupInfo != null && popupInfo.isClickThrough) {
//            if (popupInfo.isViewMode) {
//                //需要从DecorView分发，并且要排除自己，否则死循环
//                val decorView = (context as Activity).window.decorView as ViewGroup
//                for (i in 0 until decorView.childCount) {
//                    val view = decorView.getChildAt(i)
//                    if (view !== this) view.dispatchTouchEvent(event)
//                }
//            } else {
//                (context as Activity).dispatchTouchEvent(event)
//            }
//        }
//    }
//
//    private var x = 0f
//    private var y = 0f
//    override fun onTouchEvent(event: MotionEvent): Boolean {
//        // 如果自己接触到了点击，并且不在PopupContentView范围内点击，则进行判断是否是点击事件,如果是，则dismiss
//        val rect = Rect()
//        //        Rect rect2 = new Rect();
//        getPopupImplView().getGlobalVisibleRect(rect)
//        if (!XPopupUtils.isInRect(event.x, event.y, rect)) {
//            when (event.action) {
//                MotionEvent.ACTION_DOWN -> {
//                    x = event.x
//                    y = event.y
//                    passClickThrough(event)
//                }
//                MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
//                    val dx = event.x - x
//                    val dy = event.y - y
//                    val distance =
//                        Math.sqrt(Math.pow(dx.toDouble(), 2.0) + Math.pow(dy.toDouble(), 2.0)).toFloat()
//                    passClickThrough(event)
//                    if (distance < touchSlop && popupInfo != null && popupInfo.isDismissOnTouchOutside) {
//                        //查看是否在排除区域外
//                        val rects: ArrayList<Rect> = popupInfo.notDismissWhenTouchInArea
//                        if (rects != null && rects.size > 0) {
//                            var inRect = false
//                            for (r in rects) {
//                                if (XPopupUtils.isInRect(event.x, event.y, r)) {
//                                    inRect = true
//                                    break
//                                }
//                            }
//                            if (!inRect) {
//                                dismiss()
//                            }
//                        } else {
//                            dismiss()
//                        }
//                        //                        getPopupImplView().getGlobalVisibleRect(rect2);
//                    }
//                    x = 0f
//                    y = 0f
//                }
//            }
//        }
//        return true
//    }
//
//    init {
//        require(context !is Application) { "XPopup的Context必须是Activity类型！" }
//        lifecycleRegistry = LifecycleRegistry(this)
//        touchSlop = ViewConfiguration.get(context).scaledTouchSlop
//        id = generateViewId()
//        val contentView = LayoutInflater.from(context).inflate(getInnerLayoutId(), this, false)
//        // 事先隐藏，等测量完毕恢复，避免影子跳动现象。
//        contentView.alpha = 0f
//        addView(contentView)
//    }
//}